This is an exploration of dimensionality reduction on Packet 7 (last updated: 2019-05-19). KW thought of this in response to the general question of how (if at all) we can distinguish porosity “beliefs” from spiritual “experiences.”

The basic question here is whether we can distinguish beliefs from experience by tracking patterns of covariance across individual participants: What are the “clusters” of questions that tended to hang together at the participant level (i.e., if someone endorsed one question, what else did they endorse)? If porosity and spiritual experience are fully redundant with each other, we would not expect to see separate clusters of porosity vs. spiritual experience items.

Main take-away: If we retain more than 2-3 factors, we end up distinguishing between porosity and spiritual experience. Two standard methods of determining how many factors to retain (parallel analysis and minimizing BIC) both suggest retaining six or more factors.

Exploratory factor analysis (EFA)

Parallel analysis

Parallel analysis suggests retaining 13 factors.

the condition has length > 1 and only the first element will be usedJoining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

factor abs dse exsen hthk mm por se unev wob
MR1 . 13 . . . 3 11 . .
MR2 32 . . . . . . . .
MR3 2 . . . . . . . 6
MR4 . . . . 14 3 . . .
MR5 . . . . . . 11 . .
MR6 . . . . . . . . 6
MR7 . 1 . 9 . . . . .
MR8 . . . . . . . 6 .
MR9 . . . 9 . . . . .
MR10 . . . . 3 . . . .
MR11 . . . . . 10 . . .
MR12 . . 7 . . . . . .
MR13 . . . . . . . . .

Quick interpretations:

  • MR1 = spiritual experience I (dse/se)
  • MR2 = absorption
  • MR3 = other personality (wob/abs)
  • MR4 = martha mary
  • MR5 = spiritual experience II (se)
  • MR6 = sense of control (wob)
  • MR7 = need for cognition I (hthk)
  • MR8 = launay-slade (unev)
  • MR9 = need for cognition II (hthk)
  • MR10 = other porosity
  • MR11 = porosity
  • MR12 = sheep-goat (exsen)
  • [MR13 = NULL]

Focus on items that from DSE, SE, Porosity, & MM scales:

Joining, by = c("question", "factor", "scale")
Joining, by = c("question", "scale")

Minimizing BIC

Minimizing BIC suggests retaining 6 factors.

the condition has length > 1 and only the first element will be usedJoining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

factor abs dse exsen hthk mm por se unev wob
MR1 . 14 . . . 1 10 . .
MR2 2 . . 6 . . . . 6
MR3 32 . 4 4 . . . 1 .
MR4 . . 3 . 17 15 . . .
MR5 . . . . . . 12 5 .
MR6 . . . 8 . . . . 6

Quick interpretations:

  • MR1 = spiritual experience I (dse/se)
  • MR2 = other personality (hthk/wob/abs)
  • MR3 = absorption (plus some exsen/hthk/unev)
  • MR4 = porosity (mm/por)
  • MR5 = spiritual experience II (se/unev)
  • MR6 = control (hthk/wob)

Focus on items that from DSE, SE, Porosity, & MM scales:

Joining, by = c("question", "factor", "scale")
Joining, by = c("question", "scale")

Joining, by = c("question", "factor", "scale")
Joining, by = c("question", "scale")

Weisman et al. (2017) retention criteria

The retention criteria employed in Weisman et al. (2017) suggest retaining 2 factors.

the condition has length > 1 and only the first element will be usedJoining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

factor abs dse exsen hthk mm por se unev wob
MR1 2 13 4 8 17 16 19 . 5
MR2 32 1 3 10 . . 3 6 7

Quick interpretations:

  • MR1 = porosity + spiritual experience? (“spiritual”?)
  • MR2 = absorption + personality? (“secular”?)

Focus on items that from DSE, SE, Porosity, & MM scales:

Joining, by = c("question", "factor", "scale")
Joining, by = c("question", "scale")

Three-factor solution

Just for the hell of it, here’s a three-factor solution.

the condition has length > 1 and only the first element will be usedJoining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

factor abs dse exsen hthk mm por se unev wob
MR1 1 13 2 6 14 16 19 . 2
MR2 33 . 4 3 2 . 3 6 .
MR3 . 1 1 9 1 . . . 10

Quick interpretations:

  • MR1 = porosity + spiritual experience
  • MR2 = absorption (+ secular experience?)
  • MR3 = controls

Focus on items that from DSE, SE, Porosity, & MM scales:

Joining, by = c("question", "factor", "scale")
Joining, by = c("question", "scale")

Four-factor solution

Just for the hell of it, here’s a four-factor solution.

the condition has length > 1 and only the first element will be usedJoining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

factor abs dse exsen hthk mm por se unev wob
MR1 . 14 . 1 . . 19 . .
MR2 33 . 6 4 . . 3 6 .
MR3 1 . . 7 . . . . 9
MR4 . . 1 6 17 16 . . 3

Quick interpretations:

  • MR1 = spiritual experience
  • MR2 = absorption (+ secular experience?)
  • MR3 = controls
  • MR4 = porosity (+ personality?)

Focus on items that from DSE, SE, Porosity, & MM scales:

Joining, by = c("question", "factor", "scale")
Joining, by = c("question", "scale")

EXTRA SCRAPS (including only DSE, SE, Porosity, & MM items)

LS0tCnRpdGxlOiAiUGFja2V0IDcgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uIgpkYXRlOiAiMjAxOS0wNS0xOSIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgpgYGB7ciBnbG9iYWxfb3B0aW9ucywgaW5jbHVkZSA9IEZ9CmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC42NywKICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgPSBGLCBlY2hvID0gRikKYGBgCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkobGFuZ2NvZykKbGlicmFyeShwc3ljaCkKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkoY293cGxvdCkKbGlicmFyeShsbWU0KQpsaWJyYXJ5KGxtZXJUZXN0KQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkobHVicmlkYXRlKQpsaWJyYXJ5KGdnZGVuZHJvKQoKdGhlbWVfc2V0KHRoZW1lX2J3KCkpCmBgYAoKYGBge3J9CmhlYXRtYXBfZnVuIDwtIGZ1bmN0aW9uKGVmYSwgZmFjdG9yX25hbWVzID0gTkEpewogIAogICMgZ2V0IGZhY3RvciBuYW1lcwogIGlmKGlzLm5hKGZhY3Rvcl9uYW1lcykpewogICAgZmFjdG9yX25hbWVzIDwtIHBhc3RlKCJGYWN0b3IiLCAxOmVmYSRmYWN0b3JzKQogIH0KICAKICAjIHB1dCBmYWN0b3JzIGluIGEgc3RhbmRhcmQgb3JkZXIgd2hlbiBhcHBsaWNhYmxlCiAgYm9keV9mYWN0b3JzIDwtIGZhY3Rvcl9uYW1lc1tncmVwbCgiQk9EWSIsIGZhY3Rvcl9uYW1lcyldCiAgCiAgbGVmdG92ZXJzIDwtIGZhY3Rvcl9uYW1lc1shZmFjdG9yX25hbWVzICVpbiUgYm9keV9mYWN0b3JzXQogIGhlYXJ0X2ZhY3RvcnMgPC0gbGVmdG92ZXJzW2dyZXBsKCJIRUFSVCIsIGxlZnRvdmVycyldCiAgCiAgbGVmdG92ZXJzIDwtIGxlZnRvdmVyc1shbGVmdG92ZXJzICVpbiUgaGVhcnRfZmFjdG9yc10KICBtaW5kX2ZhY3RvcnMgPC0gbGVmdG92ZXJzW2dyZXBsKCJNSU5EIiwgbGVmdG92ZXJzKV0KICAKICBvdGhlcl9mYWN0b3JzIDwtIGxlZnRvdmVyc1shbGVmdG92ZXJzICVpbiUgbWluZF9mYWN0b3JzXQogIAogIGZhY3Rvcl9sZXZlbHMgPC0gYyhib2R5X2ZhY3RvcnMsIGhlYXJ0X2ZhY3RvcnMsIG1pbmRfZmFjdG9ycywgb3RoZXJfZmFjdG9ycykKICAKICAjIGdldCBmYWN0b3IgbG9hZGluZ3MKICBsb2FkaW5ncyA8LSBlZmEkbG9hZGluZ3NbXSAlPiUKICAgIGRhdGEuZnJhbWUoKSAlPiUKICAgIHJvd25hbWVzX3RvX2NvbHVtbigiY2FwYWNpdHkiKSAlPiUKICAgIGdhdGhlcihmYWN0b3IsIGxvYWRpbmcsIC1jYXBhY2l0eSkgJT4lCiAgICBtdXRhdGUoZmFjdG9yID0gYXMuY2hhcmFjdGVyKGZhY3RvcihmYWN0b3IsIGxhYmVscyA9IGZhY3Rvcl9uYW1lcykpLAogICAgICAgICAgIGZhY3RvciA9IGZhY3RvcihmYWN0b3IsIGxldmVscyA9IGZhY3Rvcl9sZXZlbHMpKQogIAogICMgZ2V0IGZhLnNvcnQoKSBvcmRlcgogIG9yZGVyIDwtIGxvYWRpbmdzICU+JQogICAgZ3JvdXBfYnkoY2FwYWNpdHkpICU+JQogICAgdG9wX24oMSwgYWJzKGxvYWRpbmcpKSAlPiUKICAgIHVuZ3JvdXAoKSAlPiUKICAgIGFycmFuZ2UoZGVzYyhmYWN0b3IpLCBhYnMobG9hZGluZykpICU+JQogICAgbXV0YXRlKG9yZGVyID0gMTpsZW5ndGgobGV2ZWxzKGZhY3Rvcihsb2FkaW5ncyRjYXBhY2l0eSkpKSkgJT4lCiAgICBzZWxlY3QoY2FwYWNpdHksIG9yZGVyKQogIAogICMgZ2V0IHBlcmNlbnQgc2hhcmVkIHZhcmlhbmNlIGV4cGxhaW5lZAogIHNoYXJlZF92YXIgPC0gZWZhJFZhY2NvdW50ZWQgJT4lCiAgICBkYXRhLmZyYW1lKCkgJT4lCiAgICByb3duYW1lc190b19jb2x1bW4oInN0YXQiKSAlPiUKICAgIGZpbHRlcihzdGF0ID09ICJQcm9wb3J0aW9uIEV4cGxhaW5lZCIpICU+JQogICAgc2VsZWN0KC1zdGF0KSAlPiUKICAgIGdhdGhlcihmYWN0b3IsIHZhcikgJT4lCiAgICBtdXRhdGUoZmFjdG9yID0gYXMuY2hhcmFjdGVyKGZhY3RvcihmYWN0b3IsIGxhYmVscyA9IGZhY3Rvcl9uYW1lcykpLAogICAgICAgICAgIGZhY3RvciA9IGZhY3RvcihmYWN0b3IsIGxldmVscyA9IGZhY3Rvcl9sZXZlbHMpKSAlPiUKICAgIG11dGF0ZSh2YXJfc2hhcmVkID0gcGFzdGUwKGZhY3RvciwgIlxuIiwgcm91bmQodmFyLCAyKSoxMDAsICIlIHNoYXJlZCB2YXIuLCIpKQogIAogICMgZ2V0IHBlcmNlbnQgdG90YWwgdmFyaWFuY2UgZXhwbGFpbmVkCiAgdG90YWxfdmFyIDwtIGVmYSRWYWNjb3VudGVkICU+JQogICAgZGF0YS5mcmFtZSgpICU+JQogICAgcm93bmFtZXNfdG9fY29sdW1uKCJzdGF0IikgJT4lCiAgICBmaWx0ZXIoc3RhdCA9PSAiUHJvcG9ydGlvbiBWYXIiKSAlPiUKICAgIHNlbGVjdCgtc3RhdCkgJT4lCiAgICBnYXRoZXIoZmFjdG9yLCB2YXIpICU+JQogICAgbXV0YXRlKGZhY3RvciA9IGFzLmNoYXJhY3RlcihmYWN0b3IoZmFjdG9yLCBsYWJlbHMgPSBmYWN0b3JfbmFtZXMpKSwKICAgICAgICAgICBmYWN0b3IgPSBmYWN0b3IoZmFjdG9yLCBsZXZlbHMgPSBmYWN0b3JfbGV2ZWxzKSkgJT4lCiAgICBtdXRhdGUodmFyX3RvdGFsID0gcGFzdGUwKHJvdW5kKHZhciwgMikqMTAwLCAiJSB0b3RhbCB2YXIuIikpCiAgCiAgIyBtYWtlIHBsb3QKICBwbG90IDwtIGdncGxvdChsb2FkaW5ncyAlPiUgCiAgICAgICAgICAgICAgICAgICBsZWZ0X2pvaW4ob3JkZXIpICU+JQogICAgICAgICAgICAgICAgICAgbGVmdF9qb2luKHNoYXJlZF92YXIgJT4lIHNlbGVjdCgtdmFyKSkgJT4lCiAgICAgICAgICAgICAgICAgICBsZWZ0X2pvaW4odG90YWxfdmFyICU+JSBzZWxlY3QoLXZhcikpICU+JQogICAgICAgICAgICAgICAgICAgbXV0YXRlKGNhcGFjaXR5ID0gZ3N1YigiXyIsICIgIiwgY2FwYWNpdHkpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvciA9IGZhY3RvcihmYWN0b3IsIGxldmVscyA9IGZhY3Rvcl9sZXZlbHMpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIgPSBwYXN0ZSh2YXJfc2hhcmVkLCB2YXJfdG90YWwsIHNlcCA9ICJcbiIpKSwKICAgICAgICAgICAgICAgICBhZXMoeCA9IHJlb3JkZXIoeGxhYiwgYXMubnVtZXJpYyhmYWN0b3IpKSwgCiAgICAgICAgICAgICAgICAgICAgIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBvcmRlciksIAogICAgICAgICAgICAgICAgICAgICBmaWxsID0gbG9hZGluZywgCiAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gZm9ybWF0KHJvdW5kKGxvYWRpbmcsIDIpLCBuc21hbGwgPSAyKSkpICsKICAgIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIpICsKICAgIGdlb21fdGV4dChzaXplID0gMykgKwogICAgc2NhbGVfZmlsbF9kaXN0aWxsZXIobGltaXRzID0gYygtMSwgMSksIAogICAgICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJSZFlsQnUiLAogICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJoZWlnaHQgPSAxMCkpICsKICAgIHRoZW1lX21pbmltYWwoKSArCiAgICBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gInRvcCIpICsKICAgIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpCiAgCiAgcmV0dXJuKHBsb3QpCiAgCn0KCnNfbW9tZW50cyA8LSBmdW5jdGlvbihwKSB7cCoocCsxKS8yfQpwYXJhbV9lc3QgPC0gZnVuY3Rpb24ocCwgaykge3AqayArIHAgLSAoayooay0xKS8yKX0KY2hlY2tfb2sgPC0gZnVuY3Rpb24ocCwgaykgewogIGEgPC0gKHAtayleMgogIGIgPC0gcCtrCiAgcmV0dXJuKGlmZWxzZShhPmIsIFRSVUUsIEZBTFNFKSkKfQptYXhfb2sgPC0gZnVuY3Rpb24ocCkgewogIGRmX2NoZWNrIDwtIGRhdGEuZnJhbWUoKQogIGZvcihpIGluIDE6cCl7CiAgICBkZl9jaGVja1tpLCJjaGVjayJdIDwtIGNoZWNrX29rKHAsaSkKICB9CiAgbWF4IDwtIGRmX2NoZWNrICU+JSBmaWx0ZXIoY2hlY2spICU+JSBucm93KCkKICByZXR1cm4obWF4KQp9CnJldGVuX2Z1biA8LSBmdW5jdGlvbihkZiwgcm90X3R5cGUgPSBjKCJvYmxpbWluIiwgInZhcmltYXgiLCAibm9uZSIpKXsKICAKICAjIGZpZ3VyZSBvdXQgbWF4IG51bWJlciBvZiBmYWN0b3JzIHRvIHJldGFpbgogIG5fdmFyIDwtIGxlbmd0aChuYW1lcyhkZikpCiAgbWF4X2sgPC0gbWF4X29rKG5fdmFyKQogIAogICMgcnVuIGVmYSB3aXRoIG1heCBmYWN0b3JzLCB1bnJvdGF0ZWQKICBmYV91bnJvdCA8LSBmYShkZiwgbmZhY3RvcnMgPSBtYXhfaywgcm90YXRlID0gIm5vbmUiLCAKICAgICAgICAgICAgICAgICBzY29yZXMgPSAidGVuQmVyZ2UiLCBpbXB1dGUgPSAibWVkaWFuIikKICBlaWdlbiA8LSBmYV91bnJvdCRWYWNjb3VudGVkICU+JQogICAgZGF0YS5mcmFtZSgpICU+JQogICAgcm93bmFtZXNfdG9fY29sdW1uKCJwYXJhbSIpICU+JQogICAgZ2F0aGVyKGZhY3RvciwgdmFsdWUsIC1wYXJhbSkgJT4lCiAgICBzcHJlYWQocGFyYW0sIHZhbHVlKSAlPiUKICAgIGZpbHRlcihgU1MgbG9hZGluZ3NgID4gMSwgYFByb3BvcnRpb24gRXhwbGFpbmVkYCA+IDAuMDUpCiAgcmV0YWluX2sgPC0gbnJvdyhlaWdlbikKICAKICBmYV9yb3QgPC0gZmEoZGYsIG5mYWN0b3JzID0gcmV0YWluX2ssIHJvdGF0ZSA9IHJvdF90eXBlLAogICAgICAgICAgICAgICBzY29yZXMgPSAidGVuQmVyZ2UiLCBpbXB1dGUgPSAibWVkaWFuIikKICAKICBsb2FkaW5ncyA8LSBmYV9yb3QkbG9hZGluZ3NbXSAlPiUKICAgIGRhdGEuZnJhbWUoKSAlPiUKICAgIHJvd25hbWVzX3RvX2NvbHVtbigiY2FwYWNpdHkiKSAlPiUKICAgIGdhdGhlcihmYWN0b3IsIGxvYWRpbmcsIC1jYXBhY2l0eSkgJT4lCiAgICBncm91cF9ieShjYXBhY2l0eSkgJT4lCiAgICB0b3BfbigxLCBhYnMobG9hZGluZykpICU+JQogICAgdW5ncm91cCgpICU+JQogICAgY291bnQoZmFjdG9yKQogIHJldGFpbl9rX2ZpbmFsIDwtIG5yb3cobG9hZGluZ3MpCiAgCiAgcmV0dXJuKHJldGFpbl9rX2ZpbmFsKQp9Cgpzb3VyY2UoIi4vc2NyaXB0cy9wN19kYXRhX3ByZXAuUiIpCmBgYAoKYGBge3J9CmQxIDwtIGQwICU+JQogIHNlbGVjdCgtY29udGFpbnMoIl9kZW1fIiksIC1lbmRzX3dpdGgoIl9jYXQiKSwgLXA3X2N0cnksCiAgICAgICAgIC1jb250YWlucygidG90YWwiKSwgLWNvbnRhaW5zKCJjaGVjayIpKSAlPiUKICBnYXRoZXIocXVlc3Rpb24sIHJlc3BvbnNlLCAtcDdfc3ViaikgJT4lCiAgIyByZXNjYWxlIGV2ZXJ5dGhpbmcgdG8gYmUgaW4gMCwgMQogIG11dGF0ZShzY2FsZSA9IGdzdWIoInA3XyIsICIiLCBxdWVzdGlvbiksCiAgICAgICAgIHNjYWxlID0gZ3N1YigiXy4qJCIsICIiLCBzY2FsZSksCiAgICAgICAgIHJlc3BvbnNlID0gY2FzZV93aGVuKAogICAgICAgICAgIHNjYWxlICVpbiUgYygiYWJzIiwgImV4c2VuIikgfiByZXNwb25zZSwKICAgICAgICAgICBzY2FsZSA9PSAiZHNlIiB+IHJlc3BvbnNlIC8gNSwKICAgICAgICAgICBzY2FsZSA9PSAiaHRoayIgfiAocmVzcG9uc2UgKyAyKSAvIDQsCiAgICAgICAgICAgc2NhbGUgJWluJSBjKCJtbSIsICJ1bmV2IikgfiByZXNwb25zZSAvIDMsCiAgICAgICAgICAgc2NhbGUgPT0gInBvciIgfiByZXNwb25zZSAvIDIsCiAgICAgICAgICAgc2NhbGUgPT0gInNlIiB+IHJlc3BvbnNlIC8gNCwKICAgICAgICAgICBzY2FsZSA9PSAid29iIiB+IChyZXNwb25zZSArIDMpIC8gNikpICU+JQogICMgZ2V0IHJpZCBvZiBmb2xsb3ctdXAgcXVlc3Rpb25zIGZvciBwb3Jvc2l0eQogIGZpbHRlcighZ3JlcGwoIl8uJCIsIHF1ZXN0aW9uKSkgJT4lCiAgc2VsZWN0KC1zY2FsZSkgJT4lCiAgc3ByZWFkKHF1ZXN0aW9uLCByZXNwb25zZSkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJwN19zdWJqIikKYGBgCgpUaGlzIGlzIGFuIGV4cGxvcmF0aW9uIG9mIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbiBvbiBQYWNrZXQgNyAobGFzdCB1cGRhdGVkOiAyMDE5LTA1LTE5KS4gS1cgdGhvdWdodCBvZiB0aGlzIGluIHJlc3BvbnNlIHRvIHRoZSBnZW5lcmFsIHF1ZXN0aW9uIG9mIGhvdyAoaWYgYXQgYWxsKSB3ZSBjYW4gZGlzdGluZ3Vpc2ggcG9yb3NpdHkgImJlbGllZnMiIGZyb20gc3Bpcml0dWFsICJleHBlcmllbmNlcy4iIAoKVGhlIGJhc2ljIHF1ZXN0aW9uIGhlcmUgaXMgd2hldGhlciB3ZSBjYW4gZGlzdGluZ3Vpc2ggYmVsaWVmcyBmcm9tIGV4cGVyaWVuY2UgYnkgdHJhY2tpbmcgcGF0dGVybnMgb2YgY292YXJpYW5jZSBhY3Jvc3MgaW5kaXZpZHVhbCBwYXJ0aWNpcGFudHM6IFdoYXQgYXJlIHRoZSAiY2x1c3RlcnMiIG9mIHF1ZXN0aW9ucyB0aGF0IHRlbmRlZCB0byBoYW5nIHRvZ2V0aGVyIGF0IHRoZSBwYXJ0aWNpcGFudCBsZXZlbCAoaS5lLiwgaWYgc29tZW9uZSBlbmRvcnNlZCBvbmUgcXVlc3Rpb24sIHdoYXQgZWxzZSBkaWQgdGhleSBlbmRvcnNlKT8gSWYgcG9yb3NpdHkgYW5kIHNwaXJpdHVhbCBleHBlcmllbmNlIGFyZSBmdWxseSByZWR1bmRhbnQgd2l0aCBlYWNoIG90aGVyLCB3ZSB3b3VsZCBfbm90XyBleHBlY3QgdG8gc2VlIHNlcGFyYXRlIGNsdXN0ZXJzIG9mIHBvcm9zaXR5IHZzLiBzcGlyaXR1YWwgZXhwZXJpZW5jZSBpdGVtcy4KCioqTWFpbiB0YWtlLWF3YXkqKjogSWYgd2UgcmV0YWluIG1vcmUgdGhhbiAyLTMgZmFjdG9ycywgd2UgZW5kIHVwIGRpc3Rpbmd1aXNoaW5nIGJldHdlZW4gcG9yb3NpdHkgYW5kIHNwaXJpdHVhbCBleHBlcmllbmNlLiBUd28gc3RhbmRhcmQgbWV0aG9kcyBvZiBkZXRlcm1pbmluZyBob3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbiAocGFyYWxsZWwgYW5hbHlzaXMgYW5kIG1pbmltaXppbmcgQklDKSBib3RoIHN1Z2dlc3QgcmV0YWluaW5nIHNpeCBvciBtb3JlIGZhY3RvcnMuIAoKCiMgRXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzIChFRkEpCgojIyBQYXJhbGxlbCBhbmFseXNpcwoKYGBge3J9CmZhLnBhcmFsbGVsKGQxKQpgYGAKClBhcmFsbGVsIGFuYWx5c2lzIHN1Z2dlc3RzIHJldGFpbmluZyAxMyBmYWN0b3JzLgoKYGBge3J9CmVmYTEzIDwtIGZhKGQxLCAxMywgcm90YXRlID0gInZhcmltYXgiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA4LCBmaWcuYXNwID0gMiwgaW5jbHVkZSA9IFR9CmhlYXRtYXBfZnVuKGVmYTEzLCBmYWN0b3JfbmFtZXMgPSBwYXN0ZTAoIk1SIiwgMToxMykpCmBgYAoKYGBge3J9CmVmYTEzX2xvYWRpbmdzIDwtIGVmYTEzJGxvYWRpbmdzW10gJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigicXVlc3Rpb24iKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBsb2FkaW5nLCAtcXVlc3Rpb24pICU+JQogIG11dGF0ZShzY2FsZSA9IGdzdWIoInA3XyIsICIiLCBxdWVzdGlvbiksCiAgICAgICAgIHNjYWxlID0gZ3N1YigiXy4qJCIsICIiLCBzY2FsZSksCiAgICAgICAgIGZhY3RvciA9IGZhY3RvcihmYWN0b3IsIGxldmVscyA9IHBhc3RlMCgiTVIiLCAxOjEzKSkpCmBgYAoKYGBge3J9CmVmYTEzX2xvYWRpbmdzX2RvbSA8LSBlZmExM19sb2FkaW5ncyAlPiUKICBncm91cF9ieShzY2FsZSwgcXVlc3Rpb24pICU+JQogIHRvcF9uKDEsIGFicyhsb2FkaW5nKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGFycmFuZ2UoZmFjdG9yLCBkZXNjKGFicyhsb2FkaW5nKSkpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBUfQplZmExM19sb2FkaW5nc19kb20gJT4lCiAgY291bnQoZmFjdG9yLCBzY2FsZSkgJT4lCiAgY29tcGxldGUoZmFjdG9yLCBzY2FsZSwgZmlsbCA9IGxpc3QobiA9ICIuIikpICU+JQogIHNwcmVhZChzY2FsZSwgbikgJT4lCiAga2FibGUoKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCgpRdWljayBpbnRlcnByZXRhdGlvbnM6CgotICoqTVIxID0gc3Bpcml0dWFsIGV4cGVyaWVuY2UgSSAoZHNlL3NlKSoqCi0gTVIyID0gYWJzb3JwdGlvbgotIE1SMyA9IG90aGVyIHBlcnNvbmFsaXR5ICh3b2IvYWJzKQotICoqTVI0ID0gbWFydGhhIG1hcnkqKgotICoqTVI1ID0gc3Bpcml0dWFsIGV4cGVyaWVuY2UgSUkgKHNlKSoqCi0gTVI2ID0gc2Vuc2Ugb2YgY29udHJvbCAod29iKQotIE1SNyA9IG5lZWQgZm9yIGNvZ25pdGlvbiBJIChodGhrKQotIE1SOCA9IGxhdW5heS1zbGFkZSAodW5ldikKLSBNUjkgPSBuZWVkIGZvciBjb2duaXRpb24gSUkgKGh0aGspCi0gKipNUjEwID0gb3RoZXIgcG9yb3NpdHkqKgotICoqTVIxMSA9IHBvcm9zaXR5KioKLSBNUjEyID0gc2hlZXAtZ29hdCAoZXhzZW4pCi0gW01SMTMgPSBOVUxMXQoKRm9jdXMgb24gKippdGVtcyoqIHRoYXQgZnJvbSBEU0UsIFNFLCBQb3Jvc2l0eSwgJiBNTSBzY2FsZXM6CgpgYGB7ciwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuOSwgaW5jbHVkZSA9IFR9CmVmYTEzX2xvYWRpbmdzX2RvbSAlPiUgCiAgbXV0YXRlKGRvbSA9ICJib2xkIikgJT4lIAogIHNlbGVjdCgtbG9hZGluZykgJT4lCiAgZnVsbF9qb2luKGVmYTEzX2xvYWRpbmdzKSAlPiUKICBmdWxsX2pvaW4oZWZhMTNfbG9hZGluZ3NfZG9tICU+JQogICAgICAgICAgICAgIGFycmFuZ2UoZGVzYyhmYWN0b3IpLCBhYnMobG9hZGluZykpICU+JQogICAgICAgICAgICAgIG11dGF0ZShvcmRlciA9IDE6bnJvdyguKSkgJT4lCiAgICAgICAgICAgICAgc2VsZWN0KHNjYWxlLCBxdWVzdGlvbiwgb3JkZXIpKSAlPiUKICBtdXRhdGUoZG9tID0gaWZlbHNlKGlzLm5hKGRvbSksICJwbGFpbiIsIGRvbSkpICU+JQogIGZpbHRlcihzY2FsZSAlaW4lIGMoImRzZSIsICJzZSIsICJwb3IiLCAibW0iKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gZmFjdG9yLCB5ID0gcmVvcmRlcihxdWVzdGlvbiwgb3JkZXIpLAogICAgICAgICAgICAgZmlsbCA9IGxvYWRpbmcsIGxhYmVsID0gZm9ybWF0KHJvdW5kKGxvYWRpbmcsIDIpLCBuc21hbGwgPSkpKSArCiAgZmFjZXRfZ3JpZChzY2FsZSB+IC4sIHNjYWxlcyA9ICJmcmVlIiwgc3BhY2UgPSAiZnJlZSIpICsKICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV90ZXh0KGFlcyhzaXplID0gZG9tLCBmb250ZmFjZSA9IGRvbSkpICsgCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIoIkZhY3RvciBsb2FkaW5nIiwgcGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKGJhcmhlaWdodCA9IDIwLCBiYXJ3aWR0aCA9IDEpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJ0b3AiKSArCiAgc2NhbGVfc2l6ZV9tYW51YWwoIkRvbWluYW50IGZhY3Rvcj8iLCAKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKDMsIDIpLCBsYWJlbHMgPSBjKCJkb21pbmFudCIsICJub3QgZG9taW5hbnQiKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDIsIGluY2x1ZGUgPSBGfQplZmExM19sb2FkaW5nc19kb20gJT4lIAogIG11dGF0ZShkb20gPSAiYm9sZCIpICU+JSAKICBzZWxlY3QoLWxvYWRpbmcpICU+JQogIGZ1bGxfam9pbihlZmExM19sb2FkaW5ncykgJT4lCiAgZnVsbF9qb2luKGVmYTEzX2xvYWRpbmdzX2RvbSAlPiUKICAgICAgICAgICAgICBhcnJhbmdlKGRlc2MoZmFjdG9yKSwgYWJzKGxvYWRpbmcpKSAlPiUKICAgICAgICAgICAgICBtdXRhdGUob3JkZXIgPSAxOm5yb3coLikpICU+JQogICAgICAgICAgICAgIHNlbGVjdChzY2FsZSwgcXVlc3Rpb24sIG9yZGVyKSkgJT4lCiAgbXV0YXRlKGRvbSA9IGlmZWxzZShpcy5uYShkb20pLCAicGxhaW4iLCBkb20pKSAlPiUKICAjIGZpbHRlcihzY2FsZSAlaW4lIGMoImRzZSIsICJzZSIsICJwb3IiLCAibW0iKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gZmFjdG9yLCB5ID0gcmVvcmRlcihxdWVzdGlvbiwgb3JkZXIpLAogICAgICAgICAgICAgZmlsbCA9IGxvYWRpbmcsIGxhYmVsID0gZm9ybWF0KHJvdW5kKGxvYWRpbmcsIDIpLCBuc21hbGwgPSkpKSArCiAgZmFjZXRfZ3JpZChzY2FsZSB+IC4sIHNjYWxlcyA9ICJmcmVlIiwgc3BhY2UgPSAiZnJlZSIpICsKICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV90ZXh0KGFlcyhzaXplID0gZG9tLCBmb250ZmFjZSA9IGRvbSkpICsgCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIoIkZhY3RvciBsb2FkaW5nIiwgcGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKGJhcmhlaWdodCA9IDIwLCBiYXJ3aWR0aCA9IDEpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJ0b3AiKSArCiAgc2NhbGVfc2l6ZV9tYW51YWwoIkRvbWluYW50IGZhY3Rvcj8iLCAKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKDMsIDIpLCBsYWJlbHMgPSBjKCJkb21pbmFudCIsICJub3QgZG9taW5hbnQiKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgoKIyMgTWluaW1pemluZyBCSUMKCmBgYHtyfQpWU1MoZDEpCmBgYAoKTWluaW1pemluZyBCSUMgc3VnZ2VzdHMgcmV0YWluaW5nIDYgZmFjdG9ycy4KCmBgYHtyfQplZmE2IDwtIGZhKGQxLCA2LCByb3RhdGUgPSAidmFyaW1heCIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAzLCBpbmNsdWRlID0gVH0KaGVhdG1hcF9mdW4oZWZhNiwgZmFjdG9yX25hbWVzID0gcGFzdGUwKCJNUiIsIDE6NikpCmBgYAoKYGBge3J9CmVmYTZfbG9hZGluZ3MgPC0gZWZhNiRsb2FkaW5nc1tdICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInF1ZXN0aW9uIikgJT4lCiAgZ2F0aGVyKGZhY3RvciwgbG9hZGluZywgLXF1ZXN0aW9uKSAlPiUKICBtdXRhdGUoc2NhbGUgPSBnc3ViKCJwN18iLCAiIiwgcXVlc3Rpb24pLAogICAgICAgICBzY2FsZSA9IGdzdWIoIl8uKiQiLCAiIiwgc2NhbGUpLAogICAgICAgICBmYWN0b3IgPSBmYWN0b3IoZmFjdG9yLCBsZXZlbHMgPSBwYXN0ZTAoIk1SIiwgMTo2KSkpCmBgYAoKYGBge3J9CmVmYTZfbG9hZGluZ3NfZG9tIDwtIGVmYTZfbG9hZGluZ3MgJT4lCiAgZ3JvdXBfYnkoc2NhbGUsIHF1ZXN0aW9uKSAlPiUKICB0b3BfbigxLCBhYnMobG9hZGluZykpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBhcnJhbmdlKGZhY3RvciwgZGVzYyhhYnMobG9hZGluZykpKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVH0KZWZhNl9sb2FkaW5nc19kb20gJT4lCiAgY291bnQoZmFjdG9yLCBzY2FsZSkgJT4lCiAgY29tcGxldGUoZmFjdG9yLCBzY2FsZSwgZmlsbCA9IGxpc3QobiA9ICIuIikpICU+JQogIHNwcmVhZChzY2FsZSwgbikgJT4lCiAga2FibGUoKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCgpRdWljayBpbnRlcnByZXRhdGlvbnM6CgotICoqTVIxID0gc3Bpcml0dWFsIGV4cGVyaWVuY2UgSSAoZHNlL3NlKSoqCi0gTVIyID0gb3RoZXIgcGVyc29uYWxpdHkgKGh0aGsvd29iL2FicykKLSBNUjMgPSBhYnNvcnB0aW9uIChwbHVzIHNvbWUgZXhzZW4vaHRoay91bmV2KQotICoqTVI0ID0gcG9yb3NpdHkgKG1tL3BvcikqKgotICoqTVI1ID0gc3Bpcml0dWFsIGV4cGVyaWVuY2UgSUkgKHNlL3VuZXYpKioKLSBNUjYgPSBjb250cm9sIChodGhrL3dvYikKCkZvY3VzIG9uICoqaXRlbXMqKiB0aGF0IGZyb20gRFNFLCBTRSwgUG9yb3NpdHksICYgTU0gc2NhbGVzOgoKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjksIGluY2x1ZGUgPSBUfQplZmE2X2xvYWRpbmdzX2RvbSAlPiUgCiAgbXV0YXRlKGRvbSA9ICJib2xkIikgJT4lIAogIHNlbGVjdCgtbG9hZGluZykgJT4lCiAgZnVsbF9qb2luKGVmYTZfbG9hZGluZ3MpICU+JQogIGZ1bGxfam9pbihlZmE2X2xvYWRpbmdzX2RvbSAlPiUKICAgICAgICAgICAgICBhcnJhbmdlKGRlc2MoZmFjdG9yKSwgYWJzKGxvYWRpbmcpKSAlPiUKICAgICAgICAgICAgICBtdXRhdGUob3JkZXIgPSAxOm5yb3coLikpICU+JQogICAgICAgICAgICAgIHNlbGVjdChzY2FsZSwgcXVlc3Rpb24sIG9yZGVyKSkgJT4lCiAgbXV0YXRlKGRvbSA9IGlmZWxzZShpcy5uYShkb20pLCAicGxhaW4iLCBkb20pKSAlPiUKICBmaWx0ZXIoc2NhbGUgJWluJSBjKCJkc2UiLCAic2UiLCAicG9yIiwgIm1tIikpICU+JQogIGdncGxvdChhZXMoeCA9IGZhY3RvciwgeSA9IHJlb3JkZXIocXVlc3Rpb24sIG9yZGVyKSwKICAgICAgICAgICAgIGZpbGwgPSBsb2FkaW5nLCBsYWJlbCA9IGZvcm1hdChyb3VuZChsb2FkaW5nLCAyKSwgbnNtYWxsID0pKSkgKwogIGZhY2V0X2dyaWQoc2NhbGUgfiAuLCBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fdGV4dChhZXMoc2l6ZSA9IGRvbSwgZm9udGZhY2UgPSBkb20pKSArIAogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKCJGYWN0b3IgbG9hZGluZyIsIHBhbGV0dGUgPSAiUmRZbEJ1IiwgbGltaXRzID0gYygtMSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJoZWlnaHQgPSAyMCwgYmFyd2lkdGggPSAxKSkgKwogIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAidG9wIikgKwogIHNjYWxlX3NpemVfbWFudWFsKCJEb21pbmFudCBmYWN0b3I/IiwgCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygzLCAyKSwgbGFiZWxzID0gYygiZG9taW5hbnQiLCAibm90IGRvbWluYW50IikpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAyLCBpbmNsdWRlID0gVH0KZWZhNl9sb2FkaW5nc19kb20gJT4lIAogIG11dGF0ZShkb20gPSAiYm9sZCIpICU+JSAKICBzZWxlY3QoLWxvYWRpbmcpICU+JQogIGZ1bGxfam9pbihlZmE2X2xvYWRpbmdzKSAlPiUKICBmdWxsX2pvaW4oZWZhNl9sb2FkaW5nc19kb20gJT4lCiAgICAgICAgICAgICAgYXJyYW5nZShkZXNjKGZhY3RvciksIGFicyhsb2FkaW5nKSkgJT4lCiAgICAgICAgICAgICAgbXV0YXRlKG9yZGVyID0gMTpucm93KC4pKSAlPiUKICAgICAgICAgICAgICBzZWxlY3Qoc2NhbGUsIHF1ZXN0aW9uLCBvcmRlcikpICU+JQogIG11dGF0ZShkb20gPSBpZmVsc2UoaXMubmEoZG9tKSwgInBsYWluIiwgZG9tKSkgJT4lCiAgIyBmaWx0ZXIoc2NhbGUgJWluJSBjKCJkc2UiLCAic2UiLCAicG9yIiwgIm1tIikpICU+JQogIGdncGxvdChhZXMoeCA9IGZhY3RvciwgeSA9IHJlb3JkZXIocXVlc3Rpb24sIG9yZGVyKSwKICAgICAgICAgICAgIGZpbGwgPSBsb2FkaW5nLCBsYWJlbCA9IGZvcm1hdChyb3VuZChsb2FkaW5nLCAyKSwgbnNtYWxsID0pKSkgKwogIGZhY2V0X2dyaWQoc2NhbGUgfiAuLCBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fdGV4dChhZXMoc2l6ZSA9IGRvbSwgZm9udGZhY2UgPSBkb20pKSArIAogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKCJGYWN0b3IgbG9hZGluZyIsIHBhbGV0dGUgPSAiUmRZbEJ1IiwgbGltaXRzID0gYygtMSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJoZWlnaHQgPSAyMCwgYmFyd2lkdGggPSAxKSkgKwogIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAidG9wIikgKwogIHNjYWxlX3NpemVfbWFudWFsKCJEb21pbmFudCBmYWN0b3I/IiwgCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygzLCAyKSwgbGFiZWxzID0gYygiZG9taW5hbnQiLCAibm90IGRvbWluYW50IikpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKIyMgV2Vpc21hbiBldCBhbC4gKDIwMTcpIHJldGVudGlvbiBjcml0ZXJpYQoKYGBge3J9CnJldGVuX2Z1bihkMSwgIm5vbmUiKQpgYGAKClRoZSByZXRlbnRpb24gY3JpdGVyaWEgZW1wbG95ZWQgaW4gV2Vpc21hbiBldCBhbC4gKDIwMTcpIHN1Z2dlc3QgcmV0YWluaW5nIDIgZmFjdG9ycy4KCmBgYHtyfQplZmEyIDwtIGZhKGQxLCAyLCByb3RhdGUgPSAidmFyaW1heCIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAzLCBpbmNsdWRlID0gVH0KaGVhdG1hcF9mdW4oZWZhMiwgZmFjdG9yX25hbWVzID0gcGFzdGUwKCJNUiIsIDE6MikpCmBgYAoKYGBge3J9CmVmYTJfbG9hZGluZ3MgPC0gZWZhMiRsb2FkaW5nc1tdICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInF1ZXN0aW9uIikgJT4lCiAgZ2F0aGVyKGZhY3RvciwgbG9hZGluZywgLXF1ZXN0aW9uKSAlPiUKICBtdXRhdGUoc2NhbGUgPSBnc3ViKCJwN18iLCAiIiwgcXVlc3Rpb24pLAogICAgICAgICBzY2FsZSA9IGdzdWIoIl8uKiQiLCAiIiwgc2NhbGUpLAogICAgICAgICBmYWN0b3IgPSBmYWN0b3IoZmFjdG9yLCBsZXZlbHMgPSBwYXN0ZTAoIk1SIiwgMToyKSkpCmBgYAoKYGBge3J9CmVmYTJfbG9hZGluZ3NfZG9tIDwtIGVmYTJfbG9hZGluZ3MgJT4lCiAgZ3JvdXBfYnkoc2NhbGUsIHF1ZXN0aW9uKSAlPiUKICB0b3BfbigxLCBhYnMobG9hZGluZykpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBhcnJhbmdlKGZhY3RvciwgZGVzYyhhYnMobG9hZGluZykpKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVH0KZWZhMl9sb2FkaW5nc19kb20gJT4lCiAgY291bnQoZmFjdG9yLCBzY2FsZSkgJT4lCiAgY29tcGxldGUoZmFjdG9yLCBzY2FsZSwgZmlsbCA9IGxpc3QobiA9ICIuIikpICU+JQogIHNwcmVhZChzY2FsZSwgbikgJT4lCiAga2FibGUoKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCgpRdWljayBpbnRlcnByZXRhdGlvbnM6CgotIE1SMSA9IHBvcm9zaXR5ICsgc3Bpcml0dWFsIGV4cGVyaWVuY2U/ICgic3Bpcml0dWFsIj8pCi0gTVIyID0gYWJzb3JwdGlvbiArIHBlcnNvbmFsaXR5PyAoInNlY3VsYXIiPykKCkZvY3VzIG9uICoqaXRlbXMqKiB0aGF0IGZyb20gRFNFLCBTRSwgUG9yb3NpdHksICYgTU0gc2NhbGVzOgoKYGBge3IsIGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAxLjUsIGluY2x1ZGUgPSBUfQplZmEyX2xvYWRpbmdzX2RvbSAlPiUgCiAgbXV0YXRlKGRvbSA9ICJib2xkIikgJT4lIAogIHNlbGVjdCgtbG9hZGluZykgJT4lCiAgZnVsbF9qb2luKGVmYTJfbG9hZGluZ3MpICU+JQogIGZ1bGxfam9pbihlZmEyX2xvYWRpbmdzX2RvbSAlPiUKICAgICAgICAgICAgICBhcnJhbmdlKGRlc2MoZmFjdG9yKSwgYWJzKGxvYWRpbmcpKSAlPiUKICAgICAgICAgICAgICBtdXRhdGUob3JkZXIgPSAxOm5yb3coLikpICU+JQogICAgICAgICAgICAgIHNlbGVjdChzY2FsZSwgcXVlc3Rpb24sIG9yZGVyKSkgJT4lCiAgbXV0YXRlKGRvbSA9IGlmZWxzZShpcy5uYShkb20pLCAicGxhaW4iLCBkb20pKSAlPiUKICBmaWx0ZXIoc2NhbGUgJWluJSBjKCJkc2UiLCAic2UiLCAicG9yIiwgIm1tIikpICU+JQogIGdncGxvdChhZXMoeCA9IGZhY3RvciwgeSA9IHJlb3JkZXIocXVlc3Rpb24sIG9yZGVyKSwKICAgICAgICAgICAgIGZpbGwgPSBsb2FkaW5nLCBsYWJlbCA9IGZvcm1hdChyb3VuZChsb2FkaW5nLCAyKSwgbnNtYWxsID0pKSkgKwogIGZhY2V0X2dyaWQoc2NhbGUgfiAuLCBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fdGV4dChhZXMoc2l6ZSA9IGRvbSwgZm9udGZhY2UgPSBkb20pKSArIAogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKCJGYWN0b3IgbG9hZGluZyIsIHBhbGV0dGUgPSAiUmRZbEJ1IiwgbGltaXRzID0gYygtMSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJoZWlnaHQgPSAyMCwgYmFyd2lkdGggPSAxKSkgKwogIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAidG9wIikgKwogIHNjYWxlX3NpemVfbWFudWFsKCJEb21pbmFudCBmYWN0b3I/IiwgCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygzLCAyKSwgbGFiZWxzID0gYygiZG9taW5hbnQiLCAibm90IGRvbWluYW50IikpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAzLCBpbmNsdWRlID0gRn0KZWZhMl9sb2FkaW5nc19kb20gJT4lIAogIG11dGF0ZShkb20gPSAiYm9sZCIpICU+JSAKICBzZWxlY3QoLWxvYWRpbmcpICU+JQogIGZ1bGxfam9pbihlZmEyX2xvYWRpbmdzKSAlPiUKICBmdWxsX2pvaW4oZWZhMl9sb2FkaW5nc19kb20gJT4lCiAgICAgICAgICAgICAgYXJyYW5nZShkZXNjKGZhY3RvciksIGFicyhsb2FkaW5nKSkgJT4lCiAgICAgICAgICAgICAgbXV0YXRlKG9yZGVyID0gMTpucm93KC4pKSAlPiUKICAgICAgICAgICAgICBzZWxlY3Qoc2NhbGUsIHF1ZXN0aW9uLCBvcmRlcikpICU+JQogIG11dGF0ZShkb20gPSBpZmVsc2UoaXMubmEoZG9tKSwgInBsYWluIiwgZG9tKSkgJT4lCiAgIyBmaWx0ZXIoc2NhbGUgJWluJSBjKCJkc2UiLCAic2UiLCAicG9yIiwgIm1tIikpICU+JQogIGdncGxvdChhZXMoeCA9IGZhY3RvciwgeSA9IHJlb3JkZXIocXVlc3Rpb24sIG9yZGVyKSwKICAgICAgICAgICAgIGZpbGwgPSBsb2FkaW5nLCBsYWJlbCA9IGZvcm1hdChyb3VuZChsb2FkaW5nLCAyKSwgbnNtYWxsID0pKSkgKwogIGZhY2V0X2dyaWQoc2NhbGUgfiAuLCBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fdGV4dChhZXMoc2l6ZSA9IGRvbSwgZm9udGZhY2UgPSBkb20pKSArIAogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKCJGYWN0b3IgbG9hZGluZyIsIHBhbGV0dGUgPSAiUmRZbEJ1IiwgbGltaXRzID0gYygtMSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJoZWlnaHQgPSAyMCwgYmFyd2lkdGggPSAxKSkgKwogIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAidG9wIikgKwogIHNjYWxlX3NpemVfbWFudWFsKCJEb21pbmFudCBmYWN0b3I/IiwgCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygzLCAyKSwgbGFiZWxzID0gYygiZG9taW5hbnQiLCAibm90IGRvbWluYW50IikpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKIyMgVGhyZWUtZmFjdG9yIHNvbHV0aW9uCgpKdXN0IGZvciB0aGUgaGVsbCBvZiBpdCwgaGVyZSdzIGEgdGhyZWUtZmFjdG9yIHNvbHV0aW9uLgoKYGBge3J9CmVmYTMgPC0gZmEoZDEsIDMsIHJvdGF0ZSA9ICJ2YXJpbWF4IikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDMsIGluY2x1ZGUgPSBUfQpoZWF0bWFwX2Z1bihlZmEzLCBmYWN0b3JfbmFtZXMgPSBwYXN0ZTAoIk1SIiwgMTozKSkKYGBgCgpgYGB7cn0KZWZhM19sb2FkaW5ncyA8LSBlZmEzJGxvYWRpbmdzW10gJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigicXVlc3Rpb24iKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBsb2FkaW5nLCAtcXVlc3Rpb24pICU+JQogIG11dGF0ZShzY2FsZSA9IGdzdWIoInA3XyIsICIiLCBxdWVzdGlvbiksCiAgICAgICAgIHNjYWxlID0gZ3N1YigiXy4qJCIsICIiLCBzY2FsZSksCiAgICAgICAgIGZhY3RvciA9IGZhY3RvcihmYWN0b3IsIGxldmVscyA9IHBhc3RlMCgiTVIiLCAxOjMpKSkKYGBgCgpgYGB7cn0KZWZhM19sb2FkaW5nc19kb20gPC0gZWZhM19sb2FkaW5ncyAlPiUKICBncm91cF9ieShzY2FsZSwgcXVlc3Rpb24pICU+JQogIHRvcF9uKDEsIGFicyhsb2FkaW5nKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGFycmFuZ2UoZmFjdG9yLCBkZXNjKGFicyhsb2FkaW5nKSkpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBUfQplZmEzX2xvYWRpbmdzX2RvbSAlPiUKICBjb3VudChmYWN0b3IsIHNjYWxlKSAlPiUKICBjb21wbGV0ZShmYWN0b3IsIHNjYWxlLCBmaWxsID0gbGlzdChuID0gIi4iKSkgJT4lCiAgc3ByZWFkKHNjYWxlLCBuKSAlPiUKICBrYWJsZSgpICU+JQogIGthYmxlX3N0eWxpbmcoKQpgYGAKClF1aWNrIGludGVycHJldGF0aW9uczoKCi0gTVIxID0gcG9yb3NpdHkgKyBzcGlyaXR1YWwgZXhwZXJpZW5jZQotIE1SMiA9IGFic29ycHRpb24gKCsgc2VjdWxhciBleHBlcmllbmNlPykKLSBNUjMgPSBjb250cm9scwoKRm9jdXMgb24gKippdGVtcyoqIHRoYXQgZnJvbSBEU0UsIFNFLCBQb3Jvc2l0eSwgJiBNTSBzY2FsZXM6CgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDEuOCwgaW5jbHVkZSA9IFR9CmVmYTNfbG9hZGluZ3NfZG9tICU+JSAKICBtdXRhdGUoZG9tID0gImJvbGQiKSAlPiUgCiAgc2VsZWN0KC1sb2FkaW5nKSAlPiUKICBmdWxsX2pvaW4oZWZhM19sb2FkaW5ncykgJT4lCiAgZnVsbF9qb2luKGVmYTNfbG9hZGluZ3NfZG9tICU+JQogICAgICAgICAgICAgIGFycmFuZ2UoZGVzYyhmYWN0b3IpLCBhYnMobG9hZGluZykpICU+JQogICAgICAgICAgICAgIG11dGF0ZShvcmRlciA9IDE6bnJvdyguKSkgJT4lCiAgICAgICAgICAgICAgc2VsZWN0KHNjYWxlLCBxdWVzdGlvbiwgb3JkZXIpKSAlPiUKICBtdXRhdGUoZG9tID0gaWZlbHNlKGlzLm5hKGRvbSksICJwbGFpbiIsIGRvbSkpICU+JQogIGZpbHRlcihzY2FsZSAlaW4lIGMoImRzZSIsICJzZSIsICJwb3IiLCAibW0iKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gZmFjdG9yLCB5ID0gcmVvcmRlcihxdWVzdGlvbiwgb3JkZXIpLAogICAgICAgICAgICAgZmlsbCA9IGxvYWRpbmcsIGxhYmVsID0gZm9ybWF0KHJvdW5kKGxvYWRpbmcsIDMpLCBuc21hbGwgPSkpKSArCiAgZmFjZXRfZ3JpZChzY2FsZSB+IC4sIHNjYWxlcyA9ICJmcmVlIiwgc3BhY2UgPSAiZnJlZSIpICsKICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV90ZXh0KGFlcyhzaXplID0gZG9tLCBmb250ZmFjZSA9IGRvbSkpICsgCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIoIkZhY3RvciBsb2FkaW5nIiwgcGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKGJhcmhlaWdodCA9IDMwLCBiYXJ3aWR0aCA9IDEpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJ0b3AiKSArCiAgc2NhbGVfc2l6ZV9tYW51YWwoIkRvbWluYW50IGZhY3Rvcj8iLCAKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKDMsIDIpLCBsYWJlbHMgPSBjKCJkb21pbmFudCIsICJub3QgZG9taW5hbnQiKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDMuNywgaW5jbHVkZSA9IEZ9CmVmYTNfbG9hZGluZ3NfZG9tICU+JSAKICBtdXRhdGUoZG9tID0gImJvbGQiKSAlPiUgCiAgc2VsZWN0KC1sb2FkaW5nKSAlPiUKICBmdWxsX2pvaW4oZWZhM19sb2FkaW5ncykgJT4lCiAgZnVsbF9qb2luKGVmYTNfbG9hZGluZ3NfZG9tICU+JQogICAgICAgICAgICAgIGFycmFuZ2UoZGVzYyhmYWN0b3IpLCBhYnMobG9hZGluZykpICU+JQogICAgICAgICAgICAgIG11dGF0ZShvcmRlciA9IDE6bnJvdyguKSkgJT4lCiAgICAgICAgICAgICAgc2VsZWN0KHNjYWxlLCBxdWVzdGlvbiwgb3JkZXIpKSAlPiUKICBtdXRhdGUoZG9tID0gaWZlbHNlKGlzLm5hKGRvbSksICJwbGFpbiIsIGRvbSkpICU+JQogICMgZmlsdGVyKHNjYWxlICVpbiUgYygiZHNlIiwgInNlIiwgInBvciIsICJtbSIpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBmYWN0b3IsIHkgPSByZW9yZGVyKHF1ZXN0aW9uLCBvcmRlciksCiAgICAgICAgICAgICBmaWxsID0gbG9hZGluZywgbGFiZWwgPSBmb3JtYXQocm91bmQobG9hZGluZywgMyksIG5zbWFsbCA9KSkpICsKICBmYWNldF9ncmlkKHNjYWxlIH4gLiwgc2NhbGVzID0gImZyZWUiLCBzcGFjZSA9ICJmcmVlIikgKwogIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3RleHQoYWVzKHNpemUgPSBkb20sIGZvbnRmYWNlID0gZG9tKSkgKyAKICBzY2FsZV9maWxsX2Rpc3RpbGxlcigiRmFjdG9yIGxvYWRpbmciLCBwYWxldHRlID0gIlJkWWxCdSIsIGxpbWl0cyA9IGMoLTEsIDEpLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoYmFyaGVpZ2h0ID0gMzAsIGJhcndpZHRoID0gMSkpICsKICBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gInRvcCIpICsKICBzY2FsZV9zaXplX21hbnVhbCgiRG9taW5hbnQgZmFjdG9yPyIsIAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoMywgMiksIGxhYmVscyA9IGMoImRvbWluYW50IiwgIm5vdCBkb21pbmFudCIpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCiMjIEZvdXItZmFjdG9yIHNvbHV0aW9uCgpKdXN0IGZvciB0aGUgaGVsbCBvZiBpdCwgaGVyZSdzIGEgZm91ci1mYWN0b3Igc29sdXRpb24uCgpgYGB7cn0KZWZhNCA8LSBmYShkMSwgNCwgcm90YXRlID0gInZhcmltYXgiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMywgaW5jbHVkZSA9IFR9CmhlYXRtYXBfZnVuKGVmYTQsIGZhY3Rvcl9uYW1lcyA9IHBhc3RlMCgiTVIiLCAxOjQpKQpgYGAKCmBgYHtyfQplZmE0X2xvYWRpbmdzIDwtIGVmYTQkbG9hZGluZ3NbXSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJxdWVzdGlvbiIpICU+JQogIGdhdGhlcihmYWN0b3IsIGxvYWRpbmcsIC1xdWVzdGlvbikgJT4lCiAgbXV0YXRlKHNjYWxlID0gZ3N1YigicDdfIiwgIiIsIHF1ZXN0aW9uKSwKICAgICAgICAgc2NhbGUgPSBnc3ViKCJfLiokIiwgIiIsIHNjYWxlKSwKICAgICAgICAgZmFjdG9yID0gZmFjdG9yKGZhY3RvciwgbGV2ZWxzID0gcGFzdGUwKCJNUiIsIDE6NCkpKQpgYGAKCmBgYHtyfQplZmE0X2xvYWRpbmdzX2RvbSA8LSBlZmE0X2xvYWRpbmdzICU+JQogIGdyb3VwX2J5KHNjYWxlLCBxdWVzdGlvbikgJT4lCiAgdG9wX24oMSwgYWJzKGxvYWRpbmcpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgYXJyYW5nZShmYWN0b3IsIGRlc2MoYWJzKGxvYWRpbmcpKSkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFR9CmVmYTRfbG9hZGluZ3NfZG9tICU+JQogIGNvdW50KGZhY3Rvciwgc2NhbGUpICU+JQogIGNvbXBsZXRlKGZhY3Rvciwgc2NhbGUsIGZpbGwgPSBsaXN0KG4gPSAiLiIpKSAlPiUKICBzcHJlYWQoc2NhbGUsIG4pICU+JQogIGthYmxlKCkgJT4lCiAga2FibGVfc3R5bGluZygpCmBgYAoKUXVpY2sgaW50ZXJwcmV0YXRpb25zOgoKLSBNUjEgPSBzcGlyaXR1YWwgZXhwZXJpZW5jZQotIE1SMiA9IGFic29ycHRpb24gKCsgc2VjdWxhciBleHBlcmllbmNlPykKLSBNUjMgPSBjb250cm9scwotIE1SNCA9IHBvcm9zaXR5ICgrIHBlcnNvbmFsaXR5PykKCkZvY3VzIG9uICoqaXRlbXMqKiB0aGF0IGZyb20gRFNFLCBTRSwgUG9yb3NpdHksICYgTU0gc2NhbGVzOgoKYGBge3IsIGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAxLjgsIGluY2x1ZGUgPSBUfQplZmE0X2xvYWRpbmdzX2RvbSAlPiUgCiAgbXV0YXRlKGRvbSA9ICJib2xkIikgJT4lIAogIHNlbGVjdCgtbG9hZGluZykgJT4lCiAgZnVsbF9qb2luKGVmYTRfbG9hZGluZ3MpICU+JQogIGZ1bGxfam9pbihlZmE0X2xvYWRpbmdzX2RvbSAlPiUKICAgICAgICAgICAgICBhcnJhbmdlKGRlc2MoZmFjdG9yKSwgYWJzKGxvYWRpbmcpKSAlPiUKICAgICAgICAgICAgICBtdXRhdGUob3JkZXIgPSAxOm5yb3coLikpICU+JQogICAgICAgICAgICAgIHNlbGVjdChzY2FsZSwgcXVlc3Rpb24sIG9yZGVyKSkgJT4lCiAgbXV0YXRlKGRvbSA9IGlmZWxzZShpcy5uYShkb20pLCAicGxhaW4iLCBkb20pKSAlPiUKICBmaWx0ZXIoc2NhbGUgJWluJSBjKCJkc2UiLCAic2UiLCAicG9yIiwgIm1tIikpICU+JQogIGdncGxvdChhZXMoeCA9IGZhY3RvciwgeSA9IHJlb3JkZXIocXVlc3Rpb24sIG9yZGVyKSwKICAgICAgICAgICAgIGZpbGwgPSBsb2FkaW5nLCBsYWJlbCA9IGZvcm1hdChyb3VuZChsb2FkaW5nLCAzKSwgbnNtYWxsID0pKSkgKwogIGZhY2V0X2dyaWQoc2NhbGUgfiAuLCBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fdGV4dChhZXMoc2l6ZSA9IGRvbSwgZm9udGZhY2UgPSBkb20pKSArIAogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKCJGYWN0b3IgbG9hZGluZyIsIHBhbGV0dGUgPSAiUmRZbEJ1IiwgbGltaXRzID0gYygtMSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJoZWlnaHQgPSAzMCwgYmFyd2lkdGggPSAxKSkgKwogIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAidG9wIikgKwogIHNjYWxlX3NpemVfbWFudWFsKCJEb21pbmFudCBmYWN0b3I/IiwgCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygzLCAyKSwgbGFiZWxzID0gYygiZG9taW5hbnQiLCAibm90IGRvbWluYW50IikpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAzLjcsIGluY2x1ZGUgPSBGfQplZmE0X2xvYWRpbmdzX2RvbSAlPiUgCiAgbXV0YXRlKGRvbSA9ICJib2xkIikgJT4lIAogIHNlbGVjdCgtbG9hZGluZykgJT4lCiAgZnVsbF9qb2luKGVmYTRfbG9hZGluZ3MpICU+JQogIGZ1bGxfam9pbihlZmE0X2xvYWRpbmdzX2RvbSAlPiUKICAgICAgICAgICAgICBhcnJhbmdlKGRlc2MoZmFjdG9yKSwgYWJzKGxvYWRpbmcpKSAlPiUKICAgICAgICAgICAgICBtdXRhdGUob3JkZXIgPSAxOm5yb3coLikpICU+JQogICAgICAgICAgICAgIHNlbGVjdChzY2FsZSwgcXVlc3Rpb24sIG9yZGVyKSkgJT4lCiAgbXV0YXRlKGRvbSA9IGlmZWxzZShpcy5uYShkb20pLCAicGxhaW4iLCBkb20pKSAlPiUKICAjIGZpbHRlcihzY2FsZSAlaW4lIGMoImRzZSIsICJzZSIsICJwb3IiLCAibW0iKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gZmFjdG9yLCB5ID0gcmVvcmRlcihxdWVzdGlvbiwgb3JkZXIpLAogICAgICAgICAgICAgZmlsbCA9IGxvYWRpbmcsIGxhYmVsID0gZm9ybWF0KHJvdW5kKGxvYWRpbmcsIDMpLCBuc21hbGwgPSkpKSArCiAgZmFjZXRfZ3JpZChzY2FsZSB+IC4sIHNjYWxlcyA9ICJmcmVlIiwgc3BhY2UgPSAiZnJlZSIpICsKICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV90ZXh0KGFlcyhzaXplID0gZG9tLCBmb250ZmFjZSA9IGRvbSkpICsgCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIoIkZhY3RvciBsb2FkaW5nIiwgcGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKGJhcmhlaWdodCA9IDMwLCBiYXJ3aWR0aCA9IDEpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJ0b3AiKSArCiAgc2NhbGVfc2l6ZV9tYW51YWwoIkRvbWluYW50IGZhY3Rvcj8iLCAKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKDMsIDIpLCBsYWJlbHMgPSBjKCJkb21pbmFudCIsICJub3QgZG9taW5hbnQiKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgoKIyBFWFRSQSBTQ1JBUFMgKGluY2x1ZGluZyBvbmx5IERTRSwgU0UsIFBvcm9zaXR5LCAmIE1NIGl0ZW1zKQoKYGBge3J9CmQyIDwtIGQxICU+JSAKICBzZWxlY3QoY29udGFpbnMoIl9wb3JfIiksIGNvbnRhaW5zKCJfbW1fIiksIGNvbnRhaW5zKCJfZHNlXyIpLCBjb250YWlucygiX3NlXyIpKQpgYGAKCmBgYHtyfQpmYS5wYXJhbGxlbChkMikKYGBgCgpgYGB7cn0KZWZhX3N1YnNldDkgPC0gZmEoZDIsIDksIHJvdGF0ZSA9ICJ2YXJpbWF4IikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gOCwgZmlnLmFzcCA9IDF9CmhlYXRtYXBfZnVuKGVmYV9zdWJzZXQ5LCBmYWN0b3JfbmFtZXMgPSBwYXN0ZTAoIk1SIiwgMTo5KSkKYGBgCgpgYGB7cn0KZWZhX3N1YnNldDlfbG9hZGluZ3MgPC0gZWZhX3N1YnNldDkkbG9hZGluZ3NbXSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJxdWVzdGlvbiIpICU+JQogIGdhdGhlcihmYWN0b3IsIGxvYWRpbmcsIC1xdWVzdGlvbikgJT4lCiAgbXV0YXRlKHNjYWxlID0gZ3N1YigicDdfIiwgIiIsIHF1ZXN0aW9uKSwKICAgICAgICAgc2NhbGUgPSBnc3ViKCJfLiokIiwgIiIsIHNjYWxlKSwKICAgICAgICAgZmFjdG9yID0gZmFjdG9yKGZhY3RvciwgbGV2ZWxzID0gcGFzdGUwKCJNUiIsIDE6OSkpKQpgYGAKCmBgYHtyfQplZmFfc3Vic2V0OV9sb2FkaW5nc19kb20gPC0gZWZhX3N1YnNldDlfbG9hZGluZ3MgJT4lCiAgZ3JvdXBfYnkoc2NhbGUsIHF1ZXN0aW9uKSAlPiUKICB0b3BfbigxLCBhYnMobG9hZGluZykpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBhcnJhbmdlKGZhY3RvciwgZGVzYyhhYnMobG9hZGluZykpKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRn0KZWZhX3N1YnNldDlfbG9hZGluZ3NfZG9tICU+JQogIGNvdW50KGZhY3Rvciwgc2NhbGUpICU+JQogIGNvbXBsZXRlKGZhY3Rvciwgc2NhbGUsIGZpbGwgPSBsaXN0KG4gPSAiLiIpKSAlPiUKICBzcHJlYWQoc2NhbGUsIG4pICU+JQogIGthYmxlKCkgJT4lCiAga2FibGVfc3R5bGluZygpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAxLjgsIGluY2x1ZGUgPSBGfQplZmFfc3Vic2V0OV9sb2FkaW5nc19kb20gJT4lIAogIG11dGF0ZShkb20gPSAiYm9sZCIpICU+JSAKICBzZWxlY3QoLWxvYWRpbmcpICU+JQogIGZ1bGxfam9pbihlZmFfc3Vic2V0OV9sb2FkaW5ncykgJT4lCiAgZnVsbF9qb2luKGVmYV9zdWJzZXQ5X2xvYWRpbmdzX2RvbSAlPiUKICAgICAgICAgICAgICBhcnJhbmdlKGRlc2MoZmFjdG9yKSwgYWJzKGxvYWRpbmcpKSAlPiUKICAgICAgICAgICAgICBtdXRhdGUob3JkZXIgPSAxOm5yb3coLikpICU+JQogICAgICAgICAgICAgIHNlbGVjdChzY2FsZSwgcXVlc3Rpb24sIG9yZGVyKSkgJT4lCiAgbXV0YXRlKGRvbSA9IGlmZWxzZShpcy5uYShkb20pLCAicGxhaW4iLCBkb20pKSAlPiUKICBmaWx0ZXIoc2NhbGUgJWluJSBjKCJkc2UiLCAic2UiLCAicG9yIiwgIm1tIikpICU+JQogIGdncGxvdChhZXMoeCA9IGZhY3RvciwgeSA9IHJlb3JkZXIocXVlc3Rpb24sIG9yZGVyKSwKICAgICAgICAgICAgIGZpbGwgPSBsb2FkaW5nLCBsYWJlbCA9IGZvcm1hdChyb3VuZChsb2FkaW5nLCAzKSwgbnNtYWxsID0pKSkgKwogIGZhY2V0X2dyaWQoc2NhbGUgfiAuLCBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fdGV4dChhZXMoc2l6ZSA9IGRvbSwgZm9udGZhY2UgPSBkb20pKSArIAogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKCJGYWN0b3IgbG9hZGluZyIsIHBhbGV0dGUgPSAiUmRZbEJ1IiwgbGltaXRzID0gYygtMSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJoZWlnaHQgPSAzMCwgYmFyd2lkdGggPSAxKSkgKwogIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAidG9wIikgKwogIHNjYWxlX3NpemVfbWFudWFsKCJEb21pbmFudCBmYWN0b3I/IiwgCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygzLCAyKSwgbGFiZWxzID0gYygiZG9taW5hbnQiLCAibm90IGRvbWluYW50IikpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKYGBge3J9ClZTUyhkMikKYGBgCgpgYGB7cn0KZWZhX3N1YnNldDcgPC0gZmEoZDIsIDcsICJ2YXJpbWF4IikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDF9CmhlYXRtYXBfZnVuKGVmYV9zdWJzZXQ3LCBmYWN0b3JfbmFtZXMgPSBwYXN0ZTAoIk1SIiwgMTo3KSkKYGBgCgpgYGB7cn0KcmV0ZW5fZnVuKGQyLCAibm9uZSIpCmBgYAoKYGBge3J9CmVmYV9zdWJzZXQzIDwtIGZhKGQyLCAzLCAidmFyaW1heCIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAxLjJ9CmhlYXRtYXBfZnVuKGVmYV9zdWJzZXQzLCBmYWN0b3JfbmFtZXMgPSBwYXN0ZTAoIk1SIiwgMTozKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDEuNX0KaGVhdG1hcF9mdW4oZmEoZDIsIDIsICJ2YXJpbWF4IiksIGZhY3Rvcl9uYW1lcyA9IHBhc3RlMCgiTVIiLCAxOjIpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gNH0KIyBFWFRSQQojIGhpZXJhcmNoaWNhbCBjbHVzdGVyaW5nCmNsdXN0IDwtIGQxICU+JSB0KCkgJT4lIGRpc3QoKSAlPiUgaGNsdXN0KCkKCmNsdXN0ICU+JQogIGdnZGVuZHJvZ3JhbShyb3RhdGUgPSBUKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgbGFicyh0aXRsZSA9ICJIaWVyYXJjaGljYWwgYWdnbG9tZXJhdGl2ZSBjbHVzdGVyaW5nIiwgCiAgICAgICBzdWJ0aXRsZSA9ICJDb21wbGV0ZSBsaW5rYWdlIChkZWZhdWx0IGZvciBzdGF0czo6aGNsdXN0KCkgZnVuY3Rpb24pIiwKICAgICAgIHkgPSAiSGVpZ2h0IiwgeCA9ICJRdWVzdGlvbiIpCmBgYAo=